str1 = "恒总好帅"
str2 = "恒总好帅"
str3 = str2
print(id(str3))
print("str1的id为"+str(id(str1)))
print("str2的id为"+str(id(str2)))
print("str1==str2:"+str(str1 == str2))
print("str1 is str2:"+str(str1 is str2))


# eval() 函数用来执行一个字符串表达式，并返回表达式的值。
print(eval("1+2"))

# print()
# sep -- 用来间隔多个对象，默认值是一个空格。
# end -- 用来设定以什么结尾。默认值是换行符 \n，我们可以换成其他字符串。
print('a', 'b', 'c', sep='+', end='好帅')
print('a', 'b', 'c', sep='+', end='好帅')
'''
while True:
    try:
        text = input('...')
        t = int(text)
        break
    except Exception as e:
        print(type(e), e)
'''

#str.strip()方法-去除字符串中传入的字符
print("a恒a总a".strip("a"))

#str.split("/", n)-以/为分隔符，分隔n次
print('a/b/c/d/e'.split('/', 2))

#条件表达式的真值判断：
#False: 值为0、None、空序列对象（长度为0）
#True: 非0、非空对象
print(0 == False)  #True

#短路逻辑 and中有False即为False, Or中有True即为True

#数值运算://整除，**幂运算，%求模，返回余数
#求整数位数
def count_long():
    a = int(input("请输入一个整数"))
    count = 0
    list = []
    while a != 0:
        yu = a % 10
        a = a//10
        count += 1
        list.append(yu)
        print("第%s位为%s" % (count, yu))
    print("共%s位数"%count)
    return

#count_long()

#判断是否是合法整数value.isdigit()方法

#异常处理raise Exception直接报错,finally不管是否报错都会执行
'''
while True:
    try:
        num = int(input("请输入一个数字："))
    except:
        raise Exception("数字错了")
    else:
        if num>0:
            print("大于0啊大于0")
    finally:
        print("finally当中的内容")
'''

# set/dict为无序序列，list、tuple、str、range为有序序列
## 有序序列可以通过下标、切片等来访问序列中的元素
dict_1 = {"a": 1, "b": 1, "c": 2}
print(dict_1.keys())

#list,tuple的切片,range()都是前包后不包
list_1 = [1,2,3,4]
print("list_1[0:2]为"+str(list_1[0:2]))
for i in range(len([1,2,3,4])):
    print(i) #返回结果为0,1,2,3为下标2

# range(len(s)-1,-1,-1)返回逆序下标
for i in range(10,0,-2):
    print(i)

# 下标和切片
# [::-1]逆序，[0::2]偶数位置，[1::]奇数位置
# 列表中插入多个元素
list_2 = ['a', 'b', 'c', 'd']
list_insert = ['e', 'f', 'g']
list_2[1:1] = list_insert #在下标为1的位置插入list_insert
print(list_2)

list_3 = ['a', 'b', 'c', 'd']
list_3[1:2] = list_insert
print(list_3)

##列表扩展方法extend(list)
list_3.append(['a','b'])#返回['a','b',['a','b']]
list_3.extend(['a','b'])#返回['a','b','a','b']
list_3 += ['a','b'] #貌似和append没区别
print(list_3)
## 列表insert方法
list_3.insert(1,'a')
print(list_3)


list_a = ['a', 'b', 'c']
list_b = reversed(list_a)#reversed是一个反转迭代器，无其他参数
print(list_b)
list_b = sorted(list_a)
print(list_b)

#列表解析式 [表达式 for 变量 in 列表] 或者 [表达式 for 变量 in 列表 if 条件]
#生成器表达式 用()圆括号
print([x**2 for x in range(100) if x%3 == 0 ])
gen = (i*2 for i in range(10))
print(gen)
for item in gen: print(item)
for item in gen: print(item) # 不会有任何输出，一个迭代器对象只能遍历一次，第二次遍历时不会返回值，因为已经迭代完了

#map(function, iterable, ...) 把func映射给可迭代对象 返回迭代器对象
#filter(func, iterable) 过滤不符合func的元素 返回迭代器对象

#生成器函数 return 改为yield
def abc(list):
    for i in list:
        yield i

print(list(abc([1,2,3])))

#字典
dict = {'b':1, 'c':2, 'a':3}
#print(dict['d'])  #不存在会报错
print(dict.get('d')) #get方法，返回key对应的value,key不存在时返回默认值
print(dict.setdefault('c',5))#和get类似 只返回value，无key返回default

print([x for x in dict.values()])
print(sorted(dict))#只返回key

#set不重复对象，无序
print("""
跨越
多行的
字符串
""")

#\在行尾时是续行符(换行但内容接续，\n换行 \t横向制表符 \\为\
print("wew\weweq")
print("a\
a\
a")
print('a\nb\nc') #\n换行
print('a\tb\tc') #\t制表符
#%格式化字符串
print("我叫 %s 今年 %d 岁!" % ('小明', 10))

#chr()返回传入整数对应的ASCII字符
#ord()返回整数对应的ASCII字符串
alphabet='abcdefghijklmnopqrstuvwxyz'
lower = ord('a') - ord('A')
print(lower)
print(str(2))

#原始字符串，字符串前加r

#字符串格式化：%和format方法
#% [flags] [width] [.precision] type
# {field:[fill][align][width][.precision]type}
print('{:6s}'.format("3.14")) #格式化为字符串，宽度至少为6
print('我%10.2f岁'%(30)) #格式化为浮点数，宽度至少10，精度为2
#前为格式化 后为value 中间是%和format

#去除字符串中首尾的空白字符 strip()方法，可以传入其他字符，默认是去除空白
str_a = '  a  '
print(str_a.strip())
#split()方法 分隔,要传入分隔符

#isdigit(),isalpha()检查每个字符
print('ewa1aa'.isdigit())

#find()方法 查找字符串，不存在返回-1,index如果不存在会报错,rfind从右开始定位
print('aa'.find("b"))

strobj = 'abcdefg'
#分隔为3段
substring = 'd'
pos = strobj.find(substring)
if pos != -1:
    print(strobj[:pos], substring, strobj[pos + len(substring):])

#join()将可迭代对象用.连接
print('.'.join(['a','b','c']))


text = 'a,b,c,d'
print(text.replace(',', '').split())

#maketrans()映射转换
#maketrans()传一个参数时必须是字典，若传两个参数须为等长字符串，有第三个参数是将第三个参数删除

tab = '13148373582weiuiwur'
tab2 = str.maketrans('123456789','*'*9)
print(tab2)#返回的是看不懂的字典,应该是映射关系吧F
print(tab.translate(tab2))

"""???
文件操作的三种模式：
• open + process + close
• open + try: process + finally： + close
• with open as handler: + process，系统自动close释放资源
"""



#模式参数 rwxa
#r只读  x写模式，新建一个文件 w打开一个文件只用于写入 a打开文件用于追加 指针放在结尾
#tb+ t文本模式 b二进制模式 +打开可读可写(w+)比较好

#函数
#形参无实际值 实参有实际值
#位置实参，基于实参位置关联函数定义中的形参
def describe_pet(animal_type,pet_name='cat'):#缺省值形参
    """显示宠物信息"""
    print("\nI have a " + animal_type + ".")
    print("My " + animal_type + "'s name is " + pet_name.title() + ".")
describe_pet('dog','harry')###位置参数
describe_pet(pet_name='dog',animal_type='harry')###关键字参数

###传参时的序列解包
#*seq: seq的元素展开为位置实参
#**dict: dict的元素变为关键字实参,

### 名字空间 global nonlocal
#如果在函数内有赋值，则该名字属于本地名字空间。
#除非通过global var声明其为全局空间的名字
#除非通过nonlocal var声明其为外层函数的名字空间的名字

#@装饰器

#顺序查找
def search(list, target):
    for i in range(len(list)):
        if list[i] == target:
            print(i)
    return -1

print(search([1,3,3,5], 3))

#二分查找
def binary_search(numbers, target):
    start = 0
    end = len(numbers) - 1
    while start <= end:
        mid = (start + end) // 2
        if target == numbers[mid]:
            return mid
        elif target < numbers[mid]:
            end = mid - 1
        else:
            start = mid + 1
    return -1
print(binary_search([1,2,3,4,5,6,7],4))

print('asadasa'.strip('a'))

list = ['a', 'b', 'c']
print(max('a','b'))
print(list)

'''
#确定整数的位数和每位数字
num = int(input("请输入一个整数"))
count = 0#位数
while num !=0:
    yu = num % 10
    num = num//10
    count += 1
    print("第%s位为%s"%(count, yu))
print("共%s位"%count)
'''

rows = int(input('输入列数： '))
i = j = k = 1 #声明变量，i用于控制外层循环（图形行数），j用于控制空格的个数，k用于控制*的个数
#等腰直角三角形1
print("等腰直角三角形1")
for i in range(0, rows):
    for k in range(0, rows - i):
        print(" * "), #注意这里的","，一定不能省略，可以起到不换行的作用
        k += 1
    i += 1

list = ['a', 'b', 'c']
print(list.reverse())